package cmd

import (
	"fmt"
	"log"

	"gorm.io/gorm"

	"BookStack/internal/domain/article"
	"BookStack/internal/domain/book"
	"BookStack/internal/domain/category"
	"BookStack/internal/domain/navigation"
	"BookStack/internal/domain/page"
	"BookStack/internal/domain/tag"
	"BookStack/internal/domain/user"
	"BookStack/internal/infrastructure/core"
)

// InstallDB 安装数据库
func InstallDB() error {
	fmt.Println("开始安装初始数据...")

	// 加载配置
	config := core.GetConfig()

	// 连接数据库
	db, err := connectDatabase(config)
	if err != nil {
		return fmt.Errorf("连接数据库失败: %v", err)
	}

	// 执行初始化操作
	if err := initializeDatabase(db); err != nil {
		return fmt.Errorf("初始化数据库失败: %v", err)
	}

	fmt.Println("初始数据安装完成")
	return nil
}

// 初始化数据库
func initializeDatabase(db *gorm.DB) error {
	// 自动迁移表结构
	log.Println("开始迁移数据表结构...")

	// 迁移用户表
	if err := db.AutoMigrate(&user.User{}); err != nil {
		return fmt.Errorf("迁移用户表失败: %v", err)
	}

	log.Println("用户表结构迁移完成")

	// 迁移文章表
	if err := db.AutoMigrate(&article.Article{}); err != nil {
		return fmt.Errorf("迁移文章表失败: %v", err)
	}

	log.Println("文章表结构迁移完成")

	// 迁移书籍相关表
	// 迁移书籍表
	if err := db.AutoMigrate(&book.Book{}); err != nil {
		return fmt.Errorf("迁移书籍表失败: %v", err)
	}

	log.Println("书籍表结构迁移完成")

	// 迁移章节表
	if err := db.AutoMigrate(&book.Chapter{}); err != nil {
		return fmt.Errorf("迁移章节表失败: %v", err)
	}

	log.Println("章节表结构迁移完成")

	// 迁移回收站表
	if err := db.AutoMigrate(&book.RecycleItem{}); err != nil {
		return fmt.Errorf("迁移回收站表失败: %v", err)
	}

	log.Println("回收站表结构迁移完成")

	// 迁移自定义页面表
	if err := db.AutoMigrate(&page.Page{}); err != nil {
		return fmt.Errorf("迁移自定义页面表失败: %v", err)
	}

	log.Println("自定义页面表结构迁移完成")

	// 迁移分类表
	if err := db.AutoMigrate(&category.Category{}); err != nil {
		return fmt.Errorf("迁移分类表失败: %v", err)
	}

	log.Println("分类表结构迁移完成")

	// 迁移标签表
	if err := db.AutoMigrate(&tag.Tag{}); err != nil {
		return fmt.Errorf("迁移标签表失败: %v", err)
	}

	log.Println("标签表结构迁移完成")

	// 迁移导航表
	if err := db.AutoMigrate(&navigation.Navigation{}); err != nil {
		return fmt.Errorf("迁移导航表失败: %v", err)
	}

	log.Println("导航表结构迁移完成")

	// TODO: 迁移其他模块表结构
	// 比如：评论、收藏、通知等

	// 创建默认超级管理员账户
	log.Println("正在创建超级管理员账户...")

	// 检查是否已存在超级管理员账户
	var count int64
	db.Model(&user.User{}).Where("role = ?", "superadmin").Count(&count)
	if count == 0 {
		// 创建超级管理员
		admin, err := user.NewUser("admin", "admin@example.com", "admin123", "超级管理员")
		if err != nil {
			return fmt.Errorf("创建超级管理员账户失败: %v", err)
		}

		// 设置为超级管理员
		if err := admin.SetRole("superadmin"); err != nil {
			return fmt.Errorf("设置超级管理员角色失败: %v", err)
		}

		// 保存到数据库
		if err := db.Create(admin).Error; err != nil {
			return fmt.Errorf("保存超级管理员账户失败: %v", err)
		}

		log.Println("超级管理员账户创建成功，账号: admin，密码: admin123")
	} else {
		log.Println("超级管理员账户已存在，跳过创建")
	}
	// ============= 示例数据如果创建失败不影响安装流程，仅记录日志 =============
	// 创建示例文章
	if err := CreateSampleArticles(db); err != nil {
		log.Printf("创建示例文章失败: %v\n", err)
	}

	// 创建示例书籍
	if err := CreateSampleBooks(db); err != nil {
		log.Printf("创建示例书籍失败: %v\n", err)
	}

	// 创建示例自定义页面
	if err := CreateSamplePages(db); err != nil {
		log.Printf("创建示例自定义页面失败: %v\n", err)
	}

	// 创建示例分类
	if err := CreateSampleCategories(db); err != nil {
		log.Printf("创建示例分类失败: %v\n", err)
	}

	// 创建示例标签
	if err := CreateSampleTags(db); err != nil {
		log.Printf("创建示例标签失败: %v\n", err)
	}

	// 创建示例导航
	if err := CreateSampleNavigations(db); err != nil {
		log.Printf("创建示例导航失败: %v\n", err)
	}

	// TODO: 创建其他模块示例数据
	// 比如：评论、收藏等示例数据

	// 创建默认配置
	// log.Println("正在创建默认配置...")

	// TODO: 实现创建默认配置的逻辑

	return nil
}
